<script>
  // 普通的add函数
  function add(x, y, z) {
    return x + y + z;
  }

  // 柯里化后的函数
  function curryingAddFn(x) {
    return function (y) {
      return function (z) {
        return x + y + z;
      };
    };
  }
  // console.log(add(10, 20, 45));
  // console.log(curryingAddFn(10)(20)(30));

  let sumEvent = (...params) => {
    return params.reduce((opt1, opt2) => {
      console.log(opt1, opt2);
      return opt1 + opt2;
    });
  };

  let currying = function (options) {
    let argument = [];
    return function consequence(...params) {
      if (!params.length) {
        return options(...argument);
      } else {
        argument.push(...params);
        console.log(argument);
        return consequence;
      }
    };
  };

  console.log(currying(sumEvent)(12, 23)(24, 10, 2)(34, 10, 22)(10)());

  /*
  假设你是一个商家，要出售商品，为了卖出去更多的商品，
  今天决定打9折进行售卖，我们可以使用以下函数进行折扣后的售出价格计算
  */
  function discount(price, discount) {
    return price * (1 - discount); // discount为小数,例如0.1代表优惠10%
  }

  const price = discount(5000, 0.1); // 5000 * (1 - 0.1) = 4500

  // 柯里化discount函数
  function discountCurry(discount) {
    return function (price) {
      return price * (1 - discount);
    };
  }

  /*
  这样我们只需要先设定一个折扣
  设定一个10%的优化价格
  接下来只需要对每一个商品的单价传入进行计算即可得到对应的折扣后的价格
  */
  const tenPercentDiscount = discountCurry(0.1);
  const goodPrice1 = tenPercentDiscount(5000); // 4500
  const goodPrice2 = tenPercentDiscount(1000); // 900
  const goodPrice3 = tenPercentDiscount(3000); // 2700

  // 计算月度电费/水费
  // let calMonthCost = curry(function (...rest) {
  //   let costList = Array.from(rest);
  //   return costList.reduce((prev, cur) => {
  //     return prev + cur;
  //   });
  // });
  // calMonthCost(1);
  // calMonthCost(2);
  // calMonthCost(3);
  // calMonthCost(4);
  // calMonthCost(5);
</script>
